//工具类：该类只做工具相关内容方法的梳理，可外部通用，可内部通用，不引入外部类
/**
 * 得到图片路径
 */
export const getImagePath = (image) => {
	if (!isEmptyObject(image)) {
		const _image = JSON.parse(image);
		return '/api/user/material/image/' + _image.id + '.jpg';
	}
	return '';
};
/**
 * 将 Number 转为 Money
 * @param {Object} money
 */
export const formateMoney = function(money) {
	let num = money || 0;
	num = num.toString().replace(/\$|,/g, '');
	if (isNaN(num)) {
		num = '0';
	}
	num = Math.floor(num * 100 + 0.50000000001);
	let cents = num % 100;
	num = Math.floor(num / 100).toString();
	if (cents < 10) {
		cents = '0' + cents;
	}
	let negative = num < 0;
	num = Math.abs(num);
	for (let i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
		num = num.substring(0, num.length - (4 * i + 3)) + ',' +
			num.substring(num.length - (4 * i + 3));
	}
	return ('￥' + (negative ? '-' : '') + num + '.' + cents);
};
/**
 * 格式化日期格式 (用于兼容ios Date对象)，将xxxx-xx-xx的时间格式，转换为 xxxx/xx/xx的格式 
 */
export const formatDate = (time) => {
	return time.replace(/\-/g, '/');
};
/**
 * 对象转URL
 * @param {object} obj
 */
export const urlEncode = (obj = {}) => {
	const result = [];
	for (const key in obj) {
		const item = obj[key];
		if (!item) {
			continue;
		}
		if (isArray(item)) {
			item.forEach(val => {
				result.push(key + '=' + val);
			});
		} else {
			result.push(key + '=' + item);
		}
	}
	return result.join('&');
};
/**
 * 遍历对象
 */
export const objForEach = (obj, callback) => {
	Object.keys(obj).forEach((key) => {
		callback(obj[key], key);
	});
};
/**
 * 字符创是否在数组内
 */
export const inArray = (search, array) => {
	for (var i in array) {
		if (array[i] == search) return true;
	}
	return false;
};
/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * 年(Y)、月(m)、日(d)、小时(H)、分(M)、秒(S) 可以用 1-2 个占位符，
 * 例子：dateFormat('YYYY-mm-dd HH:MM:SS', new Date()) ==> 2020-01-01 08:00:00
 */
export const dateFormat = (fmt, date) => {
	const opt = {
		'Y+': date.getFullYear().toString(), // 年
		'm+': (date.getMonth() + 1).toString(), // 月
		'd+': date.getDate().toString(), // 日
		'H+': date.getHours().toString(), // 时
		'M+': date.getMinutes().toString(), // 分
		'S+': date.getSeconds().toString() // 秒
		// 有其他格式化字符需求可以继续添加，必须转化成字符串
	};
	let ret;
	for (let k in opt) {
		ret = new RegExp('(' + k + ')').exec(fmt);
		if (ret) {
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')));
		};
	};
	return fmt;
};
/**
 * 是否为空对象
 * @param {*} object 源对象
 */
export const isEmptyObject = (object) => {
	return Object.keys(object).length === 0;
};
/**
 * 是否为对象
 * @param {*} object
 */
export const isObject = (object) => {
	return Object.prototype.toString.call(object) === '[object Object]';
};
/**
 * 是否为数组
 * @param {*} array
 */
export const isArray = (array) => {
	return Object.prototype.toString.call(array) === '[object Array]';
};

/**
 * 是否为空
 * @param {*} object 源对象
 */
export const isEmpty = (value) => {
	if (isArray(value)) {
		return value.length === 0;
	}
	if (isObject(value)) {
		return isEmptyObject(value);
	}
	return !value;
};
/**
 * 对象深拷贝
 * @param {*} obj 源对象
 */
export const cloneObj = (obj) => {
	let newObj = obj.constructor === Array ? [] : {};
	if (typeof obj !== 'object') {
		return;
	}
	for (let i in obj) {
		newObj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i];
	}
	return newObj;
};
// 节流函数
// 思路： 第一次先设定一个变量true，
// 第二次执行这个函数时，会判断变量是否true，
// 是则返回。当第一次的定时器执行完函数最后会设定变量为flase。
// 那么下次判断变量时则为flase，函数会依次运行。
export function throttle(fn, delay = 100) {
	// 首先设定一个变量，在没有执行我们的定时器时为null
	var timer = null;
	return function() {
		// 当我们发现这个定时器存在时，则表示定时器已经在运行中，需要返回
		if (timer) return;
		timer = setTimeout(() => {
			fn.apply(this, arguments);
			timer = null;
		}, delay);
	};
}
// 防抖函数
// 首次运行时把定时器赋值给一个变量， 第二次执行时，
// 如果间隔没超过定时器设定的时间则会清除掉定时器，
// 重新设定定时器， 依次反复， 当我们停止下来时，
// 没有执行清除定时器， 超过一定时间后触发回调函数。
// 参考文档：https://segmentfault.com/q/1010000021145192
export function debounce(fn, delay) {
	let timer;
	return function() {
		const that = this;
		const _args = arguments; // 存一下传入的参数
		if (timer) {
			clearTimeout(timer);
		}
		timer = setTimeout(function() {
			fn.apply(that, _args);
		}, delay);
	};
}
/**
 * 数组交集
 * @param {Array} 数组1
 * @param {Array} 数组2
 * @return {Array}
 */
export const arrayIntersect = (array1, array2) => {
	return array1.filter(val => array2.indexOf(val) > -1);
};
/**
 * 生成GUID
 */
export const guid = () => {
	function S4() {
		return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
	}
	return (S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4());
};
/**
 * 格式化日期: 转为 String
 * @param date
 * @param format
 * @returns {string}
 */
export function formatDatex(date, format) {
	let paddNum = function(num) {
		num += '';
		return num.replace(/^(\d)$/, '0$1');
	};
	let cfg = {
		yyyy: date.getFullYear(), //年 : 4位
		yy: date.getFullYear().toString().substring(2), //年 : 2位
		M: date.getMonth() + 1, //月 : 如果1位的时候不补0
		MM: paddNum(date.getMonth() + 1), //月 : 如果1位的时候补0
		d: date.getDate(), //日 : 如果1位的时候不补0
		dd: paddNum(date.getDate()), //日 : 如果1位的时候补0
		hh: date.getHours(), //时
		mm: date.getMinutes(), //分
		ss: date.getSeconds() //秒
	};
	format || (format = 'yyyy-MM-dd hh:mm:ss');
	return format.replace(/([a-z])(\1)*/ig, function(m) {
		return cfg[m];
	});
}
/**
 * 月份偏移
 * @param date
 * @param offset
 */
export function monthOffset(date, offset) {
	let newDate = formatDatex(date, 'yyyy-MM-01');
	newDate = new Date(newDate);
	newDate.setMonth(newDate.getMonth() + offset);
	return newDate;
}
/**
 * 所在月 有多少天
 * @param date
 */
export function monthDays(date) {
	let newDate = new Date(date.getFullYear(), date.getMonth() + 1, 0);
	return newDate.getDate();
}
/**
 * 所在月 星期几有多少天
 * @param date
 * @param day
 */
export function monthWeekDays(date, day) {
	let firstDay = new Date(date.getFullYear(), date.getMonth(), 1);
	let days = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
	let i = 0;
	let count = 0;
	do {
		firstDay.setDate(firstDay.getDate() + 1);
		count = count + (firstDay.getDay() === day ? 1 : 0);
		i++;
	} while (i < days);
	return count;
}
/**
 * 金额除以100
 */
export function priceFilter(n = 0) {
	return (n / 100).toFixed(2);
}
/**
 * 得到最近5天日期
 */
export function getFiveDay() {
	let fiveDay = [{
		name: getDay(0)
	}, {
		name: getDay(-1)
	}, {
		name: getDay(-2)
	}, {
		name: getDay(-3)
	}, {
		name: getDay(-4)
	}];
	return fiveDay;
}
/**
 * 得到日期
 */
export function getDay(day) {
	let today = new Date();
	let targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day;
	today.setTime(targetday_milliseconds);
	let tYear = today.getFullYear();
	let tMonth = today.getMonth();
	let tDate = today.getDate();
	tMonth = doHandleMonth(tMonth + 1);
	tDate = doHandleMonth(tDate);
	return tYear + '-' + tMonth + '-' + tDate;
}
/**
 * 得到日期
 */
function doHandleMonth(month) {
	let m = month;
	if (month.toString().length == 1) {
		m = '0' + month;
	}
	return m;
}
/**
 * 金额除以100
 */
export function formatBankCardNumber(cardNumber) {
  if (cardNumber.length !== 16) {
    return "Invalid card number";
  }
  let formatted = cardNumber;
  for (let i = 3; i < 13; i += 4) {
    formatted = formatted.slice(0, i) + " " + formatted.slice(i);
  }
  formatted = formatted.slice(0, 5) + "*".repeat(8) + formatted.slice(13);
  return formatted;
}